package com.powerunion.datacollection.report.excelreport.config;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Element;

import com.powerunion.datacollection.report.excelreport.Logger;
import com.powerunion.datacollection.report.excelreport.base.element.Variable;
import com.powerunion.datacollection.report.excelreport.util.HelpTools;



/**
 * 数据源配置信息保存类，该类负解析和保存一条数据源配置信息。
 * @author juny
 */
public class DataSourceConfig {
    private static Logger log = Logger.getLogger(DataSourceConfig.class);
    public static void main(String[] args) {
    }
    
    public DataSourceConfig(String name){
        params = new ArrayList();
        paramTypes = new ArrayList();
        fields = new HashMap();
        sql = "";
        this.name = name;
    }
    
    public String getName(){
        return this.name;
    }
    
    /**
     * 解析datasource对应的数据源配置节点，并把解析出来的信息保存到当前对象中。
     * @param node
     * @return
     * @throws Exception
     */
    public boolean bindDataSource(Element node) throws Exception{
        //读取Datasource信息
        Iterator notes = node.elementIterator();
        setType(node.attributeValue("type"));
        
        Element subNode = null;
        String nodeName = null;
        while (notes.hasNext()){
            subNode = (Element)notes.next();
            nodeName = subNode.getName();
            if(nodeName.equals(DATASOURCE_NOTE_ARGUMENT)){
                //取得参数名称
                String param = subNode.attributeValue("name");
                params.add(param);
                //取得参数的数据类型
                String type = subNode.attributeValue("type");
                if(HelpTools.notEmpty(type)){
                    this.paramTypes.add(type);
                }else{
                    this.paramTypes.add(Variable.STRING);
                }
            }else if(nodeName.equals(DATASOURCE_NOTE_FIELD)){
                String name = subNode.attributeValue("name");
                String type = subNode.attributeValue("type");
                if(HelpTools.notEmpty(type) && HelpTools.notEmpty(name)){
                    fields.put(name, type);
                }
            }else if(dsType.equals(DS_TYPE_DATABASE)){ //数据库数据源需要配置SQL
                if(nodeName.equals(DATASOURCE_NOTE_SQL)){
                    sql = subNode.attributeValue("value");
                    if(sql.trim().length() < 1){
                        throw new Exception(" Sql element cann't be null!");
                    }
                }
            }
        }
        return true;
    }
    
    /**
     * 设置数据源类型。
     * @param type
     */
    private void setType(String type){
        //默认数据源类型为DS_TYPE_STATIC
        if(null == type || "".equals(type)){
            dsType = DS_TYPE_STATIC;
            return;
        }
        if(isSupportedType(type)){
            dsType = type;
            return;
        }
	    //用户在配置文件中配置了不被支持的类型。
	    log.warn(type + " is not a valid datasource type.");
        dsType = DS_TYPE_STATIC;
    }
    
    /**
     * 取得数据源参数配置信息
     * @return
     */
    public List getParams(){
        return params;
    }
    
    /**
     * 取得数据源对应参数的数据类型
     * @return
     */
    public List getParamTypes(){
        return paramTypes;
    }
    
    /**
     * 取得数据源中定义的字段值
     * @return
     */
    public Map getFields(){
        return fields;
    }
    
    /**
     * 取得数据源中SQL节点配置的sql信息，该函数只有在DS_TYPE_DATABASE类型风格的
     * 数据源才有效，其他类型的数据源该函数返回null.
     * @return
     */
    public String getSQL(){
        return sql;
    }
    
    /**
     * 取得数据源类型信息。
     * @return
     */
    public String getDataSourceType(){
        return dsType;
    }
    
    public String toString(){
        StringBuffer ret = new StringBuffer();
        ret.append("type:" + dsType);
        if(dsType.equals(DS_TYPE_DATABASE)){
            ret.append(" SQL: " + sql);
        }
        ret.append("\n paramaters : \n");
        for(int i=0; i<params.size(); i++){
            ret.append(" ---param(" + i + "):" + params.get(i));
            ret.append("  type:" + paramTypes.get(i));
            ret.append("---\n");
        }
        return ret.toString();
    }
    
    /**
     * 判断指定的数据源风格是否被支持
     * @param dsType
     * @return
     */
    public static boolean isSupportedType(String dsType){
        if(dsType.equals(DS_TYPE_DATABASE) ||
           dsType.equals(DS_TYPE_STATIC) ){
            return true;
        }
        return false;
    }
    
    private List params = null;
    private List paramTypes = null;
    private Map fields = null;
    private String sql = null;
    private String name = null;
    private String dsType = null; //数据源类型
    
    //定义数据源类型,添加新的数据源后一定要修改isSupportedType（）；
    /*
     * 标识数据源类型为数据库类型数据源
     */
    public static final String DS_TYPE_DATABASE = "database";
    /*
     * 标识数据源类型为静态数据源类型
     */
    public static final String DS_TYPE_STATIC = "static";
    /*
     * 标识数据源类型为流数据源类型
     */
    public static final String DS_TYPE_STREAM = "stream";
    
    public static final String DATASOURCE = "datasource"; 
    private static final String DATASOURCE_NOTE_SQL = "sql";
    private static final String DATASOURCE_NOTE_ARGUMENT = "parameter";
    private static final String DATASOURCE_NOTE_FIELD = "field";
}
